package com.txtandword;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.ParagraphStyle;

import java.awt.*;
import java.io.*;

/**
 * jar包在pom.xml中dependency的artifactId
 * 这个文件中补充了打开word文档的方式
 * 之前讨论的重新上传的问题改为每次上传或解压会将原文件删除
 * 文件路径命名格式为：课程id+班级（可以不加）+学号+作业编号
 * （只是建议，但是需要在上传时需要记录下一次作业这中上传了的文件，在查重中需要使用。这个我实现了需要在磊哥那接受我的返回值）
 * 此处虽然实现了word与txt文档的转化，但是在压缩查重部分没有改变是对txt操作，请改变文件选择器的筛选并调用这里的函数
 * （在上传压缩的部分标注了，但是解压后是以txt保存方便查重（转换时间较长，而查重的作业很多，不太好），在查看时再转化）
 * （还有感觉是上传中压缩，上传后解压，就是说为了体现压缩上传这个功能用一个文件夹，上传到教师那解压后的txt文档一个文件夹）
 * AppTest中有所有功能函数的用法，基本都还清晰
 */
public class TxtAndWord {
    public void word2Txt(String wordPath, String txtPath) throws IOException {
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        app.setProperty("Visible", new Variant(false));
        int thisletterInt;
        char thisletter;
        //相对路径注意修改
        String currentPath = txtPath.substring(0, txtPath.lastIndexOf("\\")) + "current.txt";
        Dispatch doc1 = app.getProperty("Documents").toDispatch();
        Dispatch doc2 = Dispatch.invoke(
                doc1,
                "Open",
                Dispatch.Method,
                new Object[] { wordPath, new Variant(false), new Variant(true) },
                new int[1]).toDispatch();
        Dispatch.invoke(
                doc2,
                "SaveAs",
                Dispatch.Method,
                new Object[] { currentPath, new Variant(3)
                },
                new int[1]);
        Variant f = new Variant(false);
        Dispatch.call(doc2, "Close", f);
        File file1 = new File(wordPath);
        file1.delete();
        // txt文档的编码方式在文档开头有记录，可以读取到
        // 经过实验发现，这种方法无效，根本读不到那两个字节，不知道网上说的可行是怎么可行的
        // 屈服了，直接将文件再转换一次
        File file2 = new File(currentPath);
        InputStreamReader input = new InputStreamReader(new FileInputStream(file2), "GBK");
        OutputStreamWriter output = new OutputStreamWriter(new FileOutputStream(txtPath), "UTF-8");
        while ((thisletterInt = input.read()) != -1) {
            thisletter = (char) thisletterInt;
            output.write(thisletter);
        }
        input.close();
        output.close();
        file2.delete();
        return;
    }

    public void txt2Word(String txtPath, String wordPath) throws IOException {
        Document doc = new Document();
        Section section = doc.addSection();
        Paragraph paragraph = section.addParagraph();
        File file = new File(txtPath);
        if (file.isFile() && file.exists()) {
            InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");
            BufferedReader bufferedReader = new BufferedReader(isr);
            String lineTXT;
            while ((lineTXT = bufferedReader.readLine()) != null) {
                paragraph.appendText(lineTXT + "\n");
            }
            isr.close();
        }
        ParagraphStyle style = new ParagraphStyle(doc);
        style.setName("newstyle");
        style.getCharacterFormat().setBold(false);
        style.getCharacterFormat().setTextColor(Color.black);
        style.getCharacterFormat().setFontName("宋体");
        style.getCharacterFormat().setFontSize(12);
        doc.getStyles().add(style);
        paragraph.applyStyle("newstyle");
        paragraph.getFormat().setMirrorIndents(true);
        doc.saveToFile(wordPath, FileFormat.Docx_2013);
        doc.dispose();
        File file1 = new File(txtPath);
        file1.delete();
        return;
    }

    public void openword(String Filepath) throws IOException {
        Desktop.getDesktop().open(new File(Filepath));
        return;
    }
}
